package com.lwm.aop.utils;

import org.aspectj.lang.ProceedingJoinPoint;

/**
 * @author liweimin
 * @date 2021/6/11 10:43
 * @since
 */
public class Logger {

    public void printLogBefore() {
        System.out.println("Logger类中的前置通知。。。");
    }

    public void printLogAfter() {
        System.out.println("Logger类中的后置通知。。。");
    }

    public void exceptionLog() {
        System.out.println("Logger类中的异常通知。。。");
    }

    public void finalLog() {
        System.out.println("Logger类中的最终通知。。。");
    }

    /**
     * 问题：配置环绕通知后，切入点方法没有执行，通知方法执行了
     * 分析：对比动态代理的环绕通知，动态代理的环绕通知有明确的切入点方法调用
     * 解决：ProceedingJointPoint 接口 提供的proceed方法，此方法就相当于明确切入点调用方法，该接口可以作为环绕通知的方法参数，在程序执行时，Spring框架会为我们提供该接口的实现类使用
     */
    public Object aroundLog(ProceedingJoinPoint pjp) {
        Object returnValue = null;
        try {
            Object[] args = pjp.getArgs();//得到方法执行的参数
            System.out.println("Logger类中的环绕通知========前置通知");
            returnValue = pjp.proceed(args);//明确调用切入点方法
            System.out.println("Logger类中的环绕通知========后置通知");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("Logger类中的环绕通知========异常通知");
        } finally {
            System.out.println("Logger类中的环绕通知========最终通知");
        }

        return returnValue;
    }
}
